home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / apps / 102 / examples / st_alarm.c < prev    next >
C/C++ Source or Header  |  1987-01-25  |  9KB  |  178 lines

  1. /*   program accessory "Ein Wecker im ST" - "An ST_Alarm"
  2.    extracted from ST Computer,Nr 10 ,pp. 36-38 ,1986;
  3.    pub. in Germany in German. Works with MWC 12 Oct86-CJP with correct sp.!  */
  4.  
  5. /*  tested under the new GDOS V.1.1 14 December, 1986 - CJP - failed to work */
  6. /* changed to Raster Coordinates and  in[11] -OK-  14 December, 1986 - CJP - */
  7.  
  8. /* notes on build of accessory ; ANALOG Nov'86 p.77 - MarkWilliams C - ATARI-ST
  9. /  Creating a desk accessory requires the following steps ( not given in the
  10. /  MW C manual): save crtsg.o in a safe directory(the normal GEM startup code)
  11. /           assemble the following code to use in it's place,
  12. /           name it crtsg.o and put into the lib directory;
  13. /           after this compile with the -VGEM for a proper desk accessory.
  14. /  The MWC version of "accstart.s"--
  15.      .shri                    /shared instructions
  16.      .globl    main_          /label of C program start
  17. start:
  18.      lea       estack,sp      /set top of stack
  19.      jsr       main_          /begin program
  20.      clr.w     -(sp)          /code == terminate process
  21.      trap      $1             /GEMDOS call
  22.      .bssd
  23. ustack:   .blkw 1024          /space for stack == 1K
  24. estack:   .blkl 1             /top of stack                                  */
  25.  
  26. /* program as partly translated from German, correct for use in MWC and GDOS */
  27. /* The original text was ALCYON-C, one change for GST and one for Megamax-C  */
  28.  
  29. #include <osbind.h>                       /* system constants  */
  30. #include <gemdefs.h>                      /* GEM-definition    */
  31. #include <obdefs.h>                       /* object definition */
  32.  
  33. #define UEIN      4                       /* label line */
  34. #define WAUS      9                       /* time  line */
  35. #define WZEIT     10                      /* alarm line */
  36. #define ANZAHL    12                      /* set  alarm line */
  37.  
  38. char  *strings[] = { "ST Computer Clock Control","HOUR:","ON","OFF","ALARM:",
  39.                         "ON","OFF","____","WAKETIME: __:__","9999","OK"    } ;
  40.  
  41. TEDINFO txtinfo  = { 7L, 8L, 9L, 3, 6, 0, 0x1180, 0x0, 255, 5, 16   }  ;
  42.  
  43. OBJECT objekte[] = {
  44.            -1,  1, 11, G_BOX,    NONE,     OUTLINED,  0x21111L,   0,0,   29, 9,
  45.             2, -1, -1, G_BUTTON, NONE,     OUTLINED,  0x0L,       2,1,   25, 1,
  46.             6,  3,  5, G_BOX,    NONE,     NORMAL,    0x1100L,    2,3,   25, 1,
  47.             4, -1, -1, G_STRING, NONE,     NORMAL,    0x1L,       0,0,    6, 1,
  48.             5, -1, -1, G_BUTTON, 0x11,     NORMAL,    0X2L,      13,0,    5, 1,
  49.             2, -1, -1, G_BUTTON, 0x11,     NORMAL,    0x3L,      20,0,    5, 1,
  50.            10,  7,  9, G_BOX,    NONE,     NORMAL,    0x1100L,    2,5,   25, 1,
  51.             8, -1, -1, G_STRING, NONE,     NORMAL,    0x4L,       0,0,    7, 1,
  52.             9, -1, -1, G_BUTTON, 0X11,     NORMAL,    0x5L,      13,0,    5, 1,
  53.             6, -1, -1, G_BUTTON, 0X11,     NORMAL,    0x6L,      20,0,    5, 1,
  54.            11, -1, -1, G_FTEXT,  EDITABLE, NORMAL,    0x0L,       2,7,   15, 1,
  55.             0, -1, -1, G_BUTTON, 0X27,     NORMAL,    0xAL,      20,7,    7, 1
  56.                                                                             } ;
  57.  
  58. int  contrl[12],intin[128],intout[128],ptsin[128],ptsout[128];
  59. extern int gl_apid;                                 /* AES processor call    */
  60.                                 /* bei,i.e.for, GST:  extern short gl_apid;  */
  61. #define RC_COORDS    2
  62. main()
  63. {                                    /* bei ALCYON C:   register long zeit;  */
  64.         register unsigned long zeit;            /* bei MWC: time   variable  */
  65.  
  66.         static   char     uhr[] = "00/00/00 00:00" ;         /* static  hour */
  67.         static   char     warte[] = { 0xff, 20, 0xff,0 };
  68.         register char     zr;
  69.  
  70. /* Bei Megamax: int        tast,anz,weck,ereig,zh,vn,h,aus[57];              */
  71.  
  72.         short    tast,anz,weck,ereig,zh,vn,h,ii,in[11],aus_0,aus_1,aus[57];
  73.  
  74. /* To fix up for generality with GDOS in 1987, I add in[11] ,i.e.,work_in[11]*/
  75. /* initialize in[0] thru in[9],use in[10] --- then set up raster coordinates*/
  76.  
  77.         GRECT             fm ;
  78.         appl_init();
  79.         anz = 0 ;                                   /* start with 0 attitude */
  80.         for(h = 0; h<ANZAHL; h++)                   /* object coordinates    */
  81.         {
  82.                 rsrc_obfix(objekte,h);              /*      compute          */
  83.                 switch(objekte[h].ob_type)          /*    object type        */
  84.                 {
  85.                         case G_STRING:              /* object specification  */
  86.                         case G_BUTTON:              /* to set correctly      */
  87.                         objekte[h].ob_spec = strings[objekte[h].ob_spec];
  88.                         break;                      /* finished.....         */
  89.                         case G_FTEXT:               /* text format           */
  90.                         objekte[h].ob_spec = &txtinfo;
  91.                 }
  92.         }
  93.  
  94.         txtinfo.te_ptext  = strings[txtinfo.te_ptext] ;         /* TEDINFO  */
  95.         txtinfo.te_ptmplt = strings[txtinfo.te_ptmplt];         /*    "     */
  96.         txtinfo.te_pvalid = strings[txtinfo.te_pvalid];         /*  to set  */
  97.         form_center(objekte,&fm.g_x,&fm.g_y,&fm.g_w,&fm.g_h);   /*  center  */
  98.         objc_change(objekte,UEIN,0,fm.g_x,fm.g_y,fm.g_w,fm.g_h,SELECTED,0);
  99.         objc_change(objekte,WAUS,0,fm.g_x,fm.g_y,fm.g_w,fm.g_h,SELECTED,0);
  100.  
  101.         vn = graf_handle(&h,&zh,&h,&h) ;        zh -= 2 ;
  102.         for( ii = 0 ; ii < 10 ;  ++ ii ) in [ii] = 1 ;    /* init in array */
  103.         in[10]  = RC_COORDS ;
  104.         v_opnvwk(in,&vn,aus);
  105.         aus_0 =   aus [0] >> 5 ;
  106.         aus_1 =   aus [1]      ;
  107.         aus_1 =   aus_1 - ( aus_1 >> 7 ) ;
  108.         vst_color(vn,1);
  109.         menu_register(gl_apid,"  ST Alarm Control  " ) ;
  110.  
  111.         while(1)
  112.         {
  113.         if(anz || weck)
  114.            {
  115.                 zeit = Gettime()>>5;
  116.                 zr = ((char)zeit) & 0x3f;
  117.                 uhr[12] = zr / 10 + '0';
  118.                 uhr[13] = zr % 10 + '0';
  119.                 zeit >>=6;
  120.                 zr = zeit &0x1f;                             /* next 5 bits */
  121.                 uhr[ 9] = zr / 10 + '0';
  122.                 uhr[10] = zr % 10 + '0';
  123.             }
  124.          if(anz)
  125.             {
  126.                 zeit >>= 5;                                  /* day count   */
  127.                 zr = ((char)zeit) & 0x1f;
  128.                 uhr[ 3] = zr / 10 + '0';
  129.                 uhr[ 4] = zr % 10 + '0';                    /* American day */
  130. /*     uhr[ 0] = zr / 10 + '0';   uhr[ 1] = zr % 10 + '0';  tag German style*/
  131.                 zeit >>= 5;                                 /* month count  */
  132.                 zr = ((char)zeit) & 0xf;
  133.                 uhr[ 0] = zr / 10 + '0';
  134.                 uhr[ 1] = zr % 10 + '0';                  /* American month */
  135. /*     uhr[ 3] = zr / 10 + '0';   uhr[ 4] = zr % 10 + '0'; mon.German style */
  136.                 zr = ((char)((zeit >> 4) + 80L) % 100) & 0x7f;
  137.                 uhr[ 6] = zr / 10 + '0';                    /* year  count  */
  138.                 uhr[ 7] = zr % 10 + '0';
  139.   /*  mono or color(lowrex or medrez,with or without GDOS) with TOS in ROM  */
  140.                 v_gtext( vn , aus_0 , aus_1 , uhr ) ;
  141.   /*  where aus[0] = x_max and aus[1] = y_max: reform/lower left corner loc.*/
  142.   /*          lower right-corner-upper right                                */
  143.             }
  144.  
  145.          if(weck)                         /* that is: IF WAKE-UP CALL ?     */
  146.          if (uhr[ 9] == strings[7][0] && uhr[10] == strings[7][1] &&
  147.              uhr[12] == strings[7][2] && uhr[13] == strings[7][3])
  148.             {
  149.                  Cconout(7);
  150.                  while(Dosound(-1L));
  151.                  Dosound(warte);             /*      1.     */
  152.                  while (Dosound(-1L));
  153.                  Cconout(7);                 /* 2. pipetone */
  154.  
  155.                  form_alert(1,               /* In English  */
  156.                  "[1][ Your ST servant says:|     Now is the Time!][ OK ]");
  157.             }
  158.         ereig = evnt_multi(MU_TIMER | MU_MESAG,     /*             */
  159.         0,0,0,0,0,0,0,0,0,0,0,0,0,aus,10000,0,&h,&h,&h,&h,&h,&h);
  160.         if((ereig & MU_MESAG) && (*aus == AC_OPEN)) /* Memu action?*/
  161.             {
  162.                 form_dial(FMD_START,fm.g_x,fm.g_y,fm.g_w,fm.g_h,
  163.                                         fm.g_x,fm.g_y,fm.g_w,fm.g_h);
  164.                 objc_draw(objekte,ROOT,MAX_DEPTH,
  165.                                         fm.g_x,fm.g_y,fm.g_w,fm.g_h);
  166.                 tast = form_do(objekte,WZEIT);
  167.                 form_dial(FMD_FINISH,fm.g_x,fm.g_y,fm.g_w,fm.g_h,
  168.                                         fm.g_x,fm.g_y,fm.g_w,fm.g_h);
  169.                 objc_change(objekte,tast,0,
  170.                                         fm.g_x,fm.g_y,fm.g_w,fm.g_h,NORMAL,0);
  171.                 if(objekte[UEIN].ob_state) anz  = 1;
  172.                 else                       anz  = 0;
  173.                 if(objekte[WAUS].ob_state) weck = 0;
  174.                 else                       weck = 1;
  175.             }
  176.         }
  177. }                                                    /* das ist alles */
  178.